<?php
/**
 * SDORelation 统一关系协议的相关封装
 * 底层接口联系人 杨建东
 * 服务地址IP=114.80.135.7    端口=1234
 * 测试 URL http://114.80.135.7:8080/doc/index.html
 * @category   SDO
 * @package    Relation
 * @author     ggg <wangweijun01@snda.com> 2010-3-15 12:46 
 * @copyright  SDO OP
 * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
 * @link       http://www.sdo.com/
 * @since      File available since Release 1.0.0
 */

include_once(dirname(__FILE__).'/SDOSocket.php');

class SDORelation {


 	/**
	 * 根据用户数字账号等信息添加指定用户间的关系（同时包括正向和反向关系）。
	 * @param Long $hostId  是 关系发起者的sdid
	 * @param Long $followerId  是  被关注者的sdid
	 * @param String $appName   否 产生关系的app 名字
	 * @param Integer $appId  否 产生关系的app 内部编号
	 * @param String $remarks  否 关系备注，可填游戏区服信息
	 * @param Integer $msgEnable   否 默认为0，不调用消息接口,传入1 根据hostId，followerId,用户关系调用消息接口
	 * @return  Array 
	 * [code]
	 * Array
	 * (
	 *     [updateTime] => 1268996825765  //更新时间
	 *     [affectedItems] => 0		//影响条数
	 *     [success] => true // 是否成功
	 * )
	 * [/code]
	 */
	static public function addRelation($hostId,$followerId, $appName='',$appId='',$remarks='',$msgEnable = 0)
	{
		//请求应用名称
		$api_name	= 'RelationService.addRelation';
		
		//传递其他参数 utf-8双字节编码		
		$api_param	= array(
			'hostId' => $hostId
			,'followerId' => $followerId	
			,'appName' => $appName
			,'appId' => $appId
			,'remarks' => $remarks	
			,'mesEnable' => $msgEnable   								
		);		
		return self::send($api_name,$api_param);
	}


	/**
	 * 查询正向关系
	 * 根据用户数字账号查询该用户关注的用户关系列表，支持分页。
	 * rest 方式调用 http://114.80.135.7:8080/RelationService/getRelationFollow?sdid=12&startIndex=0&count=0
	 * @param Long $sdid  是 指定用户的数字账号
	 * @param Int $startIndex  否 开始的下标，不指定则返回所有关系列表
	 * @param Int $count  否 返回个数，不指定则返回所有关系列表
	 * @return  Array
	 * [code]
	 * Array(
	 * 	[ RelationService-getRelationFollow-response ] => Array
	 * 		(
	 * 			[relationFollows] => Array
	 * 				(
	 * 					[relationFollow] => Array
	 * 						(
	 * 							[0] => Array
	 * 								(
	 * 									[id] => 11
	 * 									[last-update-time] => 12312234
	 * 									[sdid] => 1
	 * 									[create-time] => 1143256
	 * 									[appname] => legend
	 * 									[state] => 0
	 * 									[appid] => 2
	 * 									[fsdid] => 2
	 * 									[remarks] => 1 qu 1 fu
	 * 									[groupid] => 11
	 * 								)
	 * 						)
	 * 				)
	 * 		)
	 * )
	 * [/code]
	 */
	static public function getRelationFollow($sdid,$startIndex=0,$count=0)
	{
		$api_name	= 'RelationService.getRelationFollow';
		$api_param	= array(
			'sdid' => $sdid
			,'startIndex' => $startIndex	
			,'count' => $count
		);
		return self::send($api_name,$api_param);
		
	}
	
   /**
     * 查询正向关系
     * 根据用户数字账号查询该用户关注的用户关系列表不包含分组关系信息，支持分页。
     * rest 方式调用 http://114.80.135.7:8080/RelationService/getRelationFollow?sdid=12&startIndex=0&count=0
     * @param Long $sdid  指定用户的数字账号
     * @param Int $startIndex  开始的下标，不指定则返回所有关系列表
     * @param Int $count  返回个数，不指定则返回所有关系列表
     * @return  Array
     * [code]
     * Array(
     *  [ RelationService-getRelationFollow-response ] => Array
     *      (
     *          [relationFollows] => Array
     *              (
     *                  [relationFollow] => Array
     *                      (
     *                          [0] => Array
     *                              (
     *                                  [id] => 11
     *                                  [last-update-time] => 12312234
     *                                  [sdid] => 1
     *                                  [create-time] => 1143256
     *                                  [appname] => legend
     *                                  [state] => 0
     *                                  [appid] => 2
     *                                  [fsdid] => 2
     *                                  [remarks] => 1 qu 1 fu
     *                              )
     *                      )
     *              )
     *      )
     * )
     * [/code]
     */
    static public function getRelationFollowDistinct($sdid,$startIndex=0,$count=0)
    {
        $api_name   = 'RelationService.getRelationFollowDistinct';
        $api_param  = array(
            'sdid' => $sdid
            ,'startIndex' => $startIndex    
            ,'count' => $count
        );
        return self::send($api_name,$api_param);
        
    }



	/**
	 * 查询反向关系
	 * 根据用户数字账号查询关注该用户的所有用户关系列表，支持分页。
	 * @param Long $sdid  是 指定用户的数字账号
	 * @param Int $startIndex  否 开始的下标，不指定则返回所有关系列表
	 * @param Int $count  否 返回个数，不指定则返回所有关系列表
	 * @return  Array 如查询正向关系
	 */
	static public function getRelationReverse($sdid,$startIndex=0,$count=0)
	{
		//请求应用名称
		$api_name	= 'RelationService.getRelationReverse';
		$api_param	= array(
			'sdid' => $sdid
			,'startIndex' => $startIndex	
			,'count' => $count
		);
		return self::send($api_name,$api_param);		
	}


	/**
	 * 查询双向关系
	 * 根据用户数字账号查询和该用户有双向关系的所有用户关系列表，支持分页。
	 * @param Long $sdid  指定用户的数字账号
	 * @param Int $startIndex  开始的下标，不指定则返回所有关系列表
	 * @param Int $count  返回个数，不指定则返回所有关系列表
	 * @return  Array 如查询正向关系
	 */
	static public function getBiRelation($sdid,$startIndex=0,$count=0)
	{
		//请求应用名称
		$api_name	= 'RelationService.getBiRelation';
		$api_param	= array(
			'sdid' => $sdid
			,'startIndex' => $startIndex	
			,'count' => $count
		);
		return self::send($api_name,$api_param);		
	}


	/**
	 * 共同好友推荐
	 * 根据用户数字账号搜索与该用户具有最多共同好友（双向关系）的用户列表，按共
	 * 同好友数量最多到最少返回，支持最少的共同好友数量设置。注意：该API 仅仅针
	 * 对双向关系。
	 * @param Long $sdid  是 指定用户的数字账号
	 * @param Long $commonFriendsNumber  是 最少的共同好友数量
	 * @return  Array 
	 *<code> 
	 * Array
	 * (
	 * 	[ RelationService-searchCommonFriends -response ] => Array
	 * 		(
	 * 			[commonFriends] => Array
	 * 				(
	 * 					[commonFriend] => 4
	 * 					[commonFriend] => 2 
	 * 				)
	 * 		)
	 * )
	 *</code> 
	 */
	static public function searchCommonFriends($sdid,$commonFriendsNumber)
	{
		//请求应用名称
		$api_name	= 'RelationService.searchCommonFriends';
		$api_param	= array(
			'sdid' => $sdid
			,'commonFriendsNumber' => $commonFriendsNumber	
		);
		return self::send($api_name,$api_param);		
	}


	/**
	 * 删除关系
	 * 根据用户数字账号等信息删除A 对B 的关注。
	 * @param Long $hosted  是 A 的 sdid
	 * @param Long $followerId  是 B 的sdid
	 * @return  rray
	 */
	static public function deleteRelation($hosted,$followerId)
	{
		//请求应用名称
		$api_name	= 'RelationService.deleteRelation';
		$api_param	= array(
			'hostId' => $hosted
			,'followerId' => $followerId	
		);
		return self::send($api_name,$api_param);		
	}


	/**
	 * 从分组中删除关系
	 * 根据用户数字账号和分组号从指定分组中删除关系。
	 * @param Long $hostId  是 关注发起者sdid
	 * @param Long $followerId  是 被关注的人sdid
	 * @param Long $groupId  是 分组号
	 * @return  Array 
	 */
	static public function removeRelationOutGroup($hosted,$followerId,$groupId)
	{
		//请求应用名称
		$api_name	= 'RelationService.removeRelationOutGroup';
		$api_param	= array(
			'hostId' => $hosted
			,'followerId' => $followerId	
			,'groupId' => $groupId	
			
		);
		return self::send($api_name,$api_param);			
	}


	/**
	 * 把一条记录移从一个分组移到新的分组
	 * 根据用户数字账号和关注者账号把一条关系从一个用户指定分组中移到另一个用户指定的分组中。
	 * @param Long $hosted   是 关注发起者sdid
	 * @param Long $followerId Long 是  被关注的人sdid
	 * @param Long $oldGroupId Long 是  关系从哪个分组移出
	 * @param Long $newGroupId  是 关系移向哪个分组
	 * @return  Array
	 */
	static public function updateRelationGroupId($hosted,$followerId,$oldGroupId,$groupId)
	{
		//请求应用名称
		$api_name	= 'RelationService.updateRelationGroupId';
		$api_param	= array(
			'hostId' => $hosted
			,'followerId' => $followerId	
			,'oldGroupId' => $oldGroupId	
			,'newGroupId' => $groupId	
		);
		return self::send($api_name,$api_param);	
				
	}


	/**
	 * 把一条关系插入一个分组
	 * 根据用户数字账号和关注者账号把一条关系从一个用户指定分组中移到另一个用户指定的分组中。
	 * @param Long $hosted   是 关注发起者sdid
	 * @param Long $followerId Long 是 被关注的人sdid
	 * @param Long $groupId 是  插入哪个分组
	 * @return Array
	 */
	static public function addRelationToGroup($hostId,$followerId,$groupId)
	{
		//请求应用名称
		$api_name	= 'RelationService.addRelationToGroup';
		$api_param	= array(
			'hostId' => $hostId
			,'followerId' => $followerId	
			,'groupId' => $groupId	
		);
		return self::send($api_name,$api_param);	
						
	}
	
	
   /**
     * 列出所有关注了我而我没关注的人
     * 
     * @param Long $hostId  是 关注发起者sdid
     * @return  Array
     */
    static public function getCandidatePeople($hostId)
    {
        //请求应用名称
        $api_name   = 'RelationService.getCandidatePeople';
        $api_param  = array(
            'sdid' => $hostId
        );
        return self::send($api_name,$api_param);    
                        
    }
    
   /**
     * 列出所有我关注了的却没关注我的人
     * 
     * @param Long $hostId  是 关注发起者sdid
     * @return  Array 
     */
    static public function getRecommendPeople($hostId)
    {
        //请求应用名称
        $api_name   = 'RelationService.getRecommendPeople';
        $api_param  = array(
            'sdid' => $hostId
        );
        return self::send($api_name,$api_param);    
                        
    }
    

	/**
	 * 返回一个分组对象
	 * 根据分组id 返回一个分组对象
	 * @param Long $groupId   插入哪个分组
	 * @return  Array
	 *
	 */
	static public function getGroup($groupId)
	{
		//请求应用名称
		$api_name	= 'GroupService.getGroup';
		$api_param	= array(
			'groupId' => $groupId	
		);
		return self::send($api_name,$api_param);
	}

	/**
	 * 返回一个分组下所有的正向关系
	 * 返回一个用户下指定分组中所有的正向关系，支持分页
	 * @param Long $sdid  分组的主人
	 * @param Long $groupId   分组号
	 * @param Integer $startIndex   开始的下标，不指定则返回所有关系列表
	 * @param Integer $count   返回个数，不指定则返回所有关系列表
	 * @return  Array
	 *<code> 
	 * Array
	 * (
	 *     [ GroupService-getPeopleFormGroup-response ] => Array
	 *         (
	 *             [relationFollows] => Array
	 *                 (
	 *                     [relationFollow] => Array
	 *                         (
	 *                             [0] => Array
	 *                                 (
	 *                                     [id] => 11
	 *                                     [last-update-time] => 12312234
	 *                                     [sdid] => 1
	 *                                     [create-time] => 1143256
	 *                                     [appname] => legend
	 *                                     [state] => 0
	 *                                     [appid] => 2
	 *                                     [fsdid] => 2
	 *                                     [remarks] => 1 qu 1 fu
	 *                                     [groupid] => 11
	 *                                 )
	 *                         )
	 *                 )
	 *         )
	 * )
	 *</code> 
	 * 
	 *
	 */
	static public function getPeopleFormGroup($sdid,$groupId,$startIndex,$count)
	{
		$api_name	= 'GroupService.getPeopleFromGroup';
		$api_param	= array(
		    'sdid'    => $sdid
			,'groupId' => $groupId	
			,'startIndex' => $startIndex   
			,'count ' => $count   
		);
		return self::send($api_name,$api_param);	
	}


	/**
	 * 返回一个用户下所有的分组信息
	 * 返回一个用户下所有的分组信息，支持分页
	 * @param Long $sdid  分组的主人
	 * @param Integer $startIndex   开始的下标，不指定则返回所有关系列表
	 * @param Integer $count   返回个数，不指定则返回所有关系列表
	 * @return  Array
	 *<code> 
	 * Array
	 * (
	 *     [ GroupService - getGroup -response ] => Array
	 *         (
	 *             [groups] => Array
	 *                 (
	 *                     [group] => Array
	 *                         (
	 *                             [0] => Array
	 *                                 (
	 *                                     [sdid] => 2
	 *                                     [groupid] => 2
	 *                                     [group-name] => 4
	 *                                     [Schoolmates] => 5
	 *                                 )
	 *                         )
	 *                 )
	 *         )
	 * )
	 *</code> 
	 */
	static public function getPersonGroups($sdid,$startIndex=0,$count=0)
	{
		$api_name	= 'GroupService.getPersonGroups';
		$api_param	= array(
			'sdid' => $sdid
			,'startIndex' => $startIndex	
			,'count' => $count	
		);
		return self::send($api_name,$api_param);			
	}




	/**
	 * 新建一个分组
	 * 根据用户数字账号和关注者账号把一条关系从一个用户指定分组中移到另一个用户指定的分组中。
	 * @param Long $sdid  分组的所有者
	 * @param String $groupName   分组的名字
	 * @return  boolen
	 *   'data' => int			分组id
	 *   'updateTime' => float 1269400401140
	 *   'success' => boolean true
	 *
	 */
	static public function addGroup($sdid,$groupName)
	{

		$api_name	= 'GroupService.addGroup';
		$api_param	= array(
			'sdid' => $sdid
			,'groupName' => $groupName	
		);
		return self::send($api_name,$api_param);	
	}


	/**
	 * 更改一个分组名字
	 * 修改指定分组的分组名字
	 * @param Long $groupId  分组号
	 * @param String $groupName   分组的名字
	 * @return  boolen
	 * array
	 *   'updateTime' => float 1269400257790
	 *   'affectedItems' => int 1		
 	 *  'success' => boolean true
	 *
	 */
	static public function updateGroupName($groupId,$groupName)
	{

		$api_name	= 'GroupService.updateGroupName';
		$api_param	= array(
			'groupId' => $groupId
			,'groupName' => $groupName	
		);
		return self::send($api_name,$api_param);	
	}


	/**
	 * 删除一个分组
	 * 删除一个指定groupid 的分组
	 * @param Long $groupId  分组号
	 * @return  Array
	 *
	 */
	static public function deleteGroup($groupId)
	{
		$api_name	= 'GroupService.deleteGroup';
		$api_param	= array(
			'groupId' => $groupId
		);
		return self::send($api_name,$api_param);	
	}


	/**
	 * 批量判断一个用户和一个列表中用户的关系
	 * 删除一个指定groupid 的分组
	 * @param Long $sdid  我的 sdid
	 * @param Array Long[] $getOfSdid  要判断的人的get
	 * @param Integer $judgeType  要判断的类型
	 * @return  Array
	 *
	 */
	static public function getRelationType($sdid,$getOfSdid,$judgeType)
	{
		$api_name	= 'RelationService.getRelationType';
		$api_param	= array(
			'sdid' => $sdid
			,'listOfSdid' => implode(",", $getOfSdid)
			,'judgeType' => $judgeType
		);
		return self::send($api_name,$api_param);	
	}


	/**
	 * 向服务器端发起请求
	 * @param String $apiName API名称
	 * @param Array $apiParam API相关参数
	 * 返回调用的结果
	 *
	 */
	static public function send($apiName,$apiParam)
	{
		//$result	= SDOSocket::httpRequest($apiName,$apiParam);
		$result	= SDOSocket::send($apiName,$apiParam);
		return $result;
	}
	
   /*
     * 检查返回是否正常
     * @param $result 调用send后的结果
     * @param $Error 返回错误码与信息
     * @return boolean
     */
    static function isError(&$result, &$Error = NULL)
    {
        return SDOSocket::isError($result,$Error);
    }


}